print("-----------------------调用函数-----------------------")
print("-----------------------abs-----------------------")
a = abs(-100)
print(a)
print("-----------------------max-----------------------")
i = max(1, 2, 4, 5, 23423)
print(i)

print("-----------------------数据类型转换-----------------------")

print("int 强制转换：", int('123123'))
print("int 强制转换：", int(11.123))
print("float强制转换", float('1232112.12312'))
print("str强制转换", str(1232112.12312))
print("str强制转换", str(1232112))
print("bool强制转换", bool('1232112.12312'))
print("-----------------------整数转换成十六进制hex（）-----------------------")
print(hex(ord("种")))

print("-----------------------定义函数-----------------------")


def my_abs(x):
    if not isinstance(x, (int, float)):  # 检查输入的参数智能为int和float其他类型会抛出异常
        raise TypeError('你输入的参数错误')
    print("被调用成功，结果为：", abs(x))


my_abs(1234)
# my_abs('123')

print("-----------------------定义空函数-pass----------------------")


def nop():
    pass  # pass语句什么都不做，那有什么用？实际上pass可以用来作为占位符，比如现在还没想好怎么写函数的代码，就可以先放一个pass，让代码能运行起来。


nop()

print("-------------------函数多个返回值---------------------------")
import math


def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny

x, y = move(100, 100, 60, math.pi / 6)#但其实这只是一种假象，Python函数返回的仍然是单一值：
print("result",x,y)
# 原来返回值是一个tuple！但是，在语法上，返回一个tuple可以省略括号，而多个变量可以同时接收一个tuple，按位置赋给对应的值，所以，Python的函数返回多值其实就是返回一个tuple，但写起来更方便。

r= move(100, 100, 60, math.pi / 6)#但其实这只是一种假象，Python函数返回的仍然是单一值：
print("result",r)

print("-----------------------函数的参数-----------------------")
def power(x):
    return x*x
print(power(5))

def power(x,n):
    s=1
    while n>0:
        n=n-1
        s=s*x
    return s

print(power(5,1))
print(power(5,2))
print(power(5,3))
#第一个power会被覆盖，此句子会报错，不会执行
# print(power(5))
def power(x,n=2):
    s=1
    while n>0:
        n=n-1
        s=s*x
    return s
print("-----------------------函数的默认参数-----------------------")
print(power(5))

def enroll(name,gender,age=6,city='Beijing'):
    print('name:',name)
    print('gender:',gender)
    print('age:',age)
    print('city:',city)

enroll("f35","F")

enroll("mige","M",7)#有多个默认参数时，调用的时候，既可以按顺序提供默认参数

enroll("mige","M",city="yunnan",age=100)#也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时，需要把参数名写上

print("-----------------------函数默认参数的坑-----------------------")
def add_end(L=[]):
    L.append('END')
    return L

l=add_end()
print(l)
l=add_end()
print(l)#默认的参数list会变大
l=[1,2,3]
l=add_end(l)
print(l)

def add_end(L=None):
    if L is None:
        L=[]
    L.append('END')
    return L

add_end()
l=add_end()
l=add_end([1,2,3])
print(l)

print("-----------------------函数可变参数-参数可以是0个或者多个，或者list，tuple----------------------")
def  calc(*numbers):
    sum=0
    for n in numbers:
        sum=sum+n*n
    return sum
l=[1,2,3]
t=(1,2,3)
print(calc(*l))
print(calc(*t))
print(calc(l[0],l[1],l[2]))
print(calc())
print(calc())
print("-----------------------函数关键字参数---允许你传入0个或任意个含参数名的参数-------------------")
def person(name,age,**kw):
    print('name:',name,'age',age,'other:',kw)


person("hws",14)
person("hws",14,city="dali")
extra={"city":'beijing','job':'eg'}
person('jack',34,**extra)#**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数，kw将获得一个dict，注意kw获得的dict是extra的一份拷贝，对kw的改动不会影响到函数外的extra。



print("-----------------------命名关键字参数：限制关键字参数的名字，就可以用命名关键字参数-命名关键字参数需要一个特殊分隔符*，*后面的参数被视为命名关键字参数。------------------")
def person(name,age,**kw):
    if 'city' in kw:
        pass
    if 'jobs' in kw:
        pass
    print('name:', name, 'age', age, 'other:', kw)

person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)#仍然能传进去

def person(name,age,**kw):
    if kw.get('city'):
        pass
    if 'jobs' in kw:
        pass
    print('name:', name, 'age', age, 'other:', kw)

person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)

def person(name, age, *, city, job):#命名关键字参数
    print(name, age, city, job)
#person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)报错
person('Jack', 24, city='Beijing', job='Chaoyang')

#如果函数定义中已经有了一个可变参数，后面跟着的命名关键字参数就不再需要一个特殊分隔符*了：

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

l=[1,2,3,4]
person('Jack', 24, l,city='Beijing', job='Chaoyang')

print("参数组合在Python中定义函数，可以用必选参数、\r\n\
默认参数、可变参数、关键字参数和命名关键字参数，这5种参数都\r\n\
可以组合使用。但是请注意，参数定义的顺序必须是：必选参数、默认参数\r\n\
、可变参数、命名关键字参数和关键字参数")

print("----------------------递归函数-----Python标准的解释器没有针对尾递归做优化，任何递归函数都存在栈溢出的问题。--------------------------")